iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 11

[Day 11] 物件該怎麼使用!聊 Model 的 BREAD

  • 分享至 

  • xImage
  •  

首先,來解釋一下什麼是 BREAD

BREAD Icon

一般講到資料庫存取,會用 CRUD 來簡稱資料庫的所有動作,代表資料的建立(Create),讀取(Read),更新(Update),以及刪除(Delete)。

不過筆者通常引用另一種動作簡稱,BREAD,分別代表資料庫的瀏覽(Browse),讀取(Read),更新(Edit),建立(Add),以及刪除(Delete)。多了一個常用「讀取該表所有資料」的瀏覽功能,這只是用詞的不同,釐清就可以了。

下面來一一介紹,怎麼使用 Eloquent Model 進行這五種操作!

Browse

其實存取資料表中所有資料的方式,之前不小心已經偷偷使用了,也就是

Model::all();

各位可以在資料表裡面建立一些假的 Post 資料,然後用之前我們示範的

Route::get('/test', function(){
    return App\Post::all();
});

看看結果。

如果正確顯示的話,應該可以看到在 posts 裡面的所有資料。

Read

根據 id 取得一筆資料的方式是

Model::find($id);

我們可以試看看,改寫前面的路徑

Route::get('/test', function(){
    return App\Post::find(1);
});

只取得 id 為 1 的 Post 資料內容。

{
    id: 1,
    content: "Laravel demo 6.0",
    created_at: null,
    updated_at: null
}

Edit

編輯單一資料的方式,為修改對應物件的參數之後,執行

$model->save();

來進行儲存。

我們改寫之前的測試路徑

Route::get('/test', function(){
    $post = App\Post::find(1);
    $post->content = 'Laravel demo 6.0 day 11';
    $post->save();
    return $post;
});

成功之後,應該會看到

{
    id: 1,
    content: "Laravel demo 6.0 day 11",
    created_at: null,
    updated_at: "2019-09-13 08:53:01"
}

不僅僅內容改了,同時也更新了 updated_at

Mass Edit

如果要同時編輯多筆資料,我們可以用 update() 這個函式

我們來嘗試看看

Route::get('/test', function(){
    $posts = App\Post::all();
    $posts->each->update([
        'content' => 'Laravel demo 6.0 day 11 test'
    ]);
    return $posts;
});

成功的話,應該可以在資料庫裡面發現所有的 Post 現在內容都是 Laravel demo 6.0 day 11 test,並且他們的 updated_at 都變了。

(提問:細心的讀者可能會發現,資料庫中的 updated_at 時間,跟現在時間好像不太一樣。請問可能是怎樣的緣故導致,又該怎麼修正呢?留給各位讀者在留言區內回答囉。)

Add

新增的時候,我們先建立物件,然後用前面過的

$model->save();

來進行新增。

我們來嘗試看看

    $post = new App\Post;
    $post->content = 'Laravel demo 6.0 day 11';
    $post->save();
    return $post;

成功的話,應該會看到

{
    content: "Laravel demo 6.0 day 11",
    updated_at: "2019-09-13 09:04:34",
    created_at: "2019-09-13 09:04:34",
    id: 2
}

不僅僅幫我們填入了 created_atupdated_at,還幫我們將 id 多增加了一位。

Delete

刪除資料的語法是

$model->delete();

我們一樣用測試路徑,將之前資料庫 id 為 1 的資料刪除看看。

Route::get('/test', function(){
    $post = App\Post::find(1);
    $post->delete();
});

這時候連線 http://127.0.0.1/test,順利的話,我們連線資料庫時,應該會看到資料庫 id 為 1 的資料,成功被刪除了。

大量刪除

要大量刪除資料,我們可以用 destroy() 這個函式。

Route::get('/test', function(){
    $posts = App\Post::destroy([2, 3]);
    return $posts;
});

成功的話,應該會發現資料庫裡面 id 是 2 和 3 的資料都被刪除了。


總結一下今天我們學到了些什麼,今天我們學到了怎麼利用 Eloquent Model 來存取資料庫,取得資料的方法,以及五種不同的操作!

希望各位覺得今天有收穫,中秋節快樂!


上一篇
[Day 10] 存取資料庫內容!來談 Eloquent Model
下一篇
[Day 12] 實作物件之間的關聯!談 Laravel Model Relation
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
b97201019
iT邦新手 5 級 ‧ 2019-10-03 15:16:27

請問像是$post = Post::find(1);
是不是要改成$posts = App\Post::find(1);
我沒加App\會跳錯耶囧

ReccaChao iT邦研究生 5 級 ‧ 2019-10-03 15:46:38 檢舉

沒錯。如果不想寫這麼長的話,最前面要先 use App\Post;

教學我還是先不用 use 的方式好了,比較簡單

0
Neil
iT邦新手 5 級 ‧ 2019-12-31 21:39:11

update_at 時間不一致, 應該是要修改 config/app.php 的 timezone?

ReccaChao iT邦研究生 5 級 ‧ 2020-01-02 16:45:46 檢舉

Laravel 裡面設置時區,建議用 .env 裡面的 APP_TIMEZONE 進行設置喔!

這樣可以在不同主機上使用不同時區時,不需要修改程式碼。

已經照上面設定修改了,用php date()函式可以取得正確的亞洲時間

date('Y-m-d H:i:s');
# 2020-05-14 17:39:17

但db裡面的時間還是一樣沒變是什麼原因呢

{
"updated_at":"2020-05-14T09:39:17.000000Z"
}

我要留言

立即登入留言